package com.example.lt.service.audit;

import com.example.lt.constant.AuditMsgMap;
import com.example.lt.constant.AuditStatus;
import com.example.lt.entity.json.DetailsJson;
import com.example.lt.entity.json.ResultChildJson;
import com.example.lt.entity.response.AuditResponse;
import com.qiniu.http.Client;
import com.qiniu.http.Response;
import com.qiniu.storage.Configuration;
import com.qiniu.storage.Region;
import com.qiniu.util.StringMap;
import org.springframework.stereotype.Service;
import org.springframework.util.ObjectUtils;

import java.util.List;
import java.util.Map;

/**
 * @Author 小涛Tao
 * @Date: 2024/07/31/21:08
 * version 1.0 注释：文本内容审核
 **/
@Service
public class TextAuditService extends AbstractAuditService<String, AuditResponse>{

    // 文本内容审核 API 地址
    static String textUrl = "http://ai.qiniuapi.com/v3/text/censor";

    // 根据官方文档的示例来自定义请求体
    static String textBody = "{\n" +
            "    \"data\": {\n" +
            "        \"text\": \"${text}\"\n" +
            "    },\n" +
            "    \"params\": {\n" +
            "        \"scenes\": [\n" +
            "            \"antispam\"\n" +
            "        ]\n" +
            "    }\n" +
            "}";

    @Override
    public AuditResponse audit(String text) {
        AuditResponse auditResponse = new AuditResponse();
        auditResponse.setAuditStatus(AuditStatus.SUCCESS); // 暂时先设置为审核成功

        // 审核开关，在系统表中 0：表示关闭  1：表示开启
        if (!isNeedAudit()) {
            return auditResponse;
        }

        String body = textBody.replace("${text}", text);// 把需要审核的文本放入请求体数据部分中
        String method = "POST";
        // 获取包含认证信息的 token ，调用 qiNiuConfig 中的 getToken 方法获取
        final String token = qiNiuConfig.getToken(textUrl, method, body, contentType);
        // 设置访问审核文本 API 的请求头
        StringMap header = new StringMap();
        header.put("Host", "ai.qiniuapi.com");
        header.put("Authorization", token);
        header.put("Content-Type", contentType);
        Configuration cfg = new Configuration(Region.region2());
        final Client client = new Client(cfg);
        try {
            Response response = client.post(textUrl, body.getBytes(), header, contentType);
            // 获取响应的详细信息并按照 "\n" 进行分割，然后获取第三部分，因为文本审核结果中的 result 就是第三部分
            // 然后通过 objectMapper 将字符串转换成 Map 对象
            final Map map = objectMapper.readValue(response.getInfo().split("\n")[2], Map.class);
            // 将 map 中 key 为 "result" 的值转换成 ResultChildJson.class 类型的对象
            final ResultChildJson resultChild = objectMapper.convertValue(map.get("result"), ResultChildJson.class);

            // 文本审核直接审核 suggestion ，如果返回结果中的 suggestion 不是 pass 的话，就去遍历
            if (!resultChild.getSuggestion().equals("pass")) {
                auditResponse.setAuditStatus(AuditStatus.PASS); // 设置审核结果为不通过
                final List<DetailsJson> details = resultChild.getScenes().getAntispam().getDetails();
                if (!ObjectUtils.isEmpty(details)) {
                    // 遍历找到有问题的
                    for (DetailsJson detail : details) {
                        if (!detail.getLabel().equals("normal")) {
                            // 如果这个 detail 中的标签 label 不是 "normal" ，就去查到 label 对应的违规信息
                            auditResponse.setMsg(AuditMsgMap.getInfo(detail.getLabel()) + "\n");
                        }
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        // 返回审核结果
        return auditResponse;
    }

}
